package adapter;

import javax.swing.JOptionPane;

import akka.actor.*;
import models.*;
import models.msgs.*;

/**
 * Klasa obslugujaca komunikaty uzyskane od serwera podczas gry.
 * @author Artur Smolibowski
 */
public class ServerGTaskController {
  /**
   * Referencja do klasy glownej.
   */
  private ActorRef table;
  private ActorRef client;
  private String clientName;
  
  static private String[] CardsColor = new String[] { "Heart", "Diamon", "Spade", "Club" };
  static private String[] CardsType = new String[] { "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"};
  static private String[] RodzajZagrania = new String[] { "Poczatek Parti", "CHECK", "RAISE", "CALL", "FOLD", "ALLIN" };
  /**
   * Konstruktor klasy.
   * @param table Referencja do klasy glownej.
   */
  ServerGTaskController(ActorRef table, ActorRef client, String clientName) {
    this.table=table;
    this.client=client;
    this.clientName=clientName;
  }
  /**
   * Komunikat od serwera ze gracz dolaczyl do gry.
   * @param task Zapytanie od serwera.
   */
  public void G_PLAYERJOIN(String task) {
    task=task.substring(13);
    table.tell(new Result("Nowy gracz dolaczyl do gry.","PLAYERJOIN"),client);
  }
  /**
   * Komunikat od serwera ze gracz oposcil gre.
   * @param task Zapytanie od serwera.
   */
  public void G_PLAYEROUT(String task) {
	task=task.substring(12);
	table.tell(new Result("Jednek z graczy opuscil gre.","PLAYEROUT"),client);
  }
  /**
   * Metoda obslugujaca komunikat dajacy talie gracza.
   * @param task Zapytanie od serwera.
   */
  public void G_CARDS(String task) {
	task=task.substring(9);
    int[][] tmp = new int[2][5];
    for(int i=0; i<5; i++) {
      tmp[1][i]=Integer.parseInt(task.substring(0, task.indexOf(",")));
      tmp[0][i]=Integer.parseInt(task.substring(task.indexOf(",")+1, task.indexOf(";")));
      try{ task=task.substring(task.indexOf(";")+1); }
      catch( IndexOutOfBoundsException e ) { }
    }
    
    String taliaGracza="";
    for(int i=0; i<5; i++)
      taliaGracza+=CardsType[tmp[0][i]]+" "+CardsColor[tmp[1][i]]+" | ";
    
    table.tell(new Result(taliaGracza,"CARDS"), client);
  }
  /**
   * Metoda obslugujaca komunikat dajacy talie wszystkich graczy.
   * @param task Zapytanie od serwera.
   */
  public void G_ALL(String task) {
    task=task.substring(7);
    String[] idPlayers = new String[4];
    int[][][] playersCards = new int[4][2][5];
    String idWiner;
    int i;
    for(i=0;task.contains(";");i++) {
      idPlayers[i]=task.substring(0, task.indexOf(","));
      task=task.substring(task.indexOf(",")+1);
      for(int j=0;j<5;j++) {
        playersCards[i][1][j]=Integer.parseInt(task.substring(0, task.indexOf(",")));
        task=task.substring(task.indexOf(",")+1);
        playersCards[i][0][j]=Integer.parseInt(task.substring(0, task.indexOf(";")));
        task=task.substring(task.indexOf(";")+1);
      }
      task=task.substring(2);
    }

    idWiner=task;
    
    for(int j=0;j<i;j++) {
      String taliaGracza="";
      for(int k=0; k<5; k++)
        taliaGracza+=CardsType[playersCards[j][0][k]]+" "+CardsColor[playersCards[j][1][k]]+" | ";
      
      table.tell(new DeckMsg(idPlayers[j], taliaGracza, "ALL"),client);
    }

    table.tell(new DeckMsg(idWiner, "Wygralem", "ALL"),client);
  }
  /**
   * Specjalny komunikat dla gry samych botow, wysylajacy ich wszystkie karty.
   * @param task Zapytanie od serwera.
   */
  public void G_BALL(String task) {
    task=task.substring(8);
    String[] idPlayers = new String[4];
    int[][][] playersCards = new int[4][2][5];
    int i;
    for(i=0;task.contains(";");i++) {
      idPlayers[i]=task.substring(0, task.indexOf(","));
      task=task.substring(task.indexOf(",")+1);
      for(int j=0;j<5;j++) {
        playersCards[i][1][j]=Integer.parseInt(task.substring(0, task.indexOf(",")));
        task=task.substring(task.indexOf(",")+1);
        playersCards[i][0][j]=Integer.parseInt(task.substring(0, task.indexOf(";")));
        task=task.substring(task.indexOf(";")+1);
      }
      try { task=task.substring(2); } catch(StringIndexOutOfBoundsException e) {}
    }
    
    table.tell(new DeckMsg("0", "Pierwsze rozdanie botow", "BALL"),client);

    for(int j=0;j<i;j++) {
      String taliaGracza="";
      for(int k=0; k<5; k++)
        taliaGracza+=CardsType[playersCards[j][0][k]]+" "+CardsColor[playersCards[j][1][k]]+" | ";
      
      table.tell(new DeckMsg(idPlayers[j], taliaGracza, "BALL"),client);
    }
    
  }
  
  public void G_BID(String task) {
    task=task.substring(6);
    String idGracza=task.substring(0, task.indexOf("_"));
    task=task.substring(task.indexOf("_")+1);
    int ostatnieZagranie=Integer.parseInt(task.substring(0, task.indexOf("_")));
    task=task.substring(task.indexOf("_")+1);
    int aktualnaStawka=Integer.parseInt(task.substring(0, task.indexOf("_")));
    task=task.substring(task.indexOf("_")+1);
    String kasaWPuli=task;
    
    String msg = "Zagrano: "+RodzajZagrania[ostatnieZagranie]+" Ile do stawki: "+aktualnaStawka+" Kasa w puli: "+kasaWPuli;
    
    table.tell(new LicytacjaMsg(idGracza,msg),client);
  }
  
  public void G_WYMIANA(String task) {
    //task=task.substring(9);
    table.tell(new Result("Wymian kart","WYMIANA"),client);
  }
  
  public void G_CASH(String task) {
	task=task.substring(8);
	int i;
	
	String[] playersID = new String[4];
	int[] playersCash = new int[4];
    for(i=0;task.contains(",");i++) {
      playersID[i]=task.substring(0, task.indexOf(","));
      task=task.substring(task.indexOf(",")+1);
      playersCash[i]=Integer.parseInt(task.substring(0, task.indexOf("]")));
      try { task=task.substring(task.indexOf("]")+2); } catch(StringIndexOutOfBoundsException e) {}
    }
    
    for(int j=0;j<i;j++) {
      table.tell(new DeckMsg(playersID[j],"Posiadam: "+playersCash[j],"CASH"),client);
    }
  }
  
  public void G_RANKING(String task) {
    task=task.substring(10);
    
    int liczbaGraczy = Integer.parseInt(task.substring(0, task.indexOf("_")));
    task=task.substring(task.indexOf("_")+1);
    int IloscParti = Integer.parseInt(task.substring(0, task.indexOf("_")));
    task=task.substring(task.indexOf("[")+1);
    int[] numerRundy = new int[IloscParti];
    
    String[] zwyciesca = new String[IloscParti];
    int[][] pieniadze = new int[IloscParti][liczbaGraczy];
    String[][] idGraczy = new String[IloscParti][liczbaGraczy];
    
    for(int i=0;i<IloscParti;i++) {
      numerRundy[i]=Integer.parseInt(task.substring(0, task.indexOf(";")));
      task=task.substring(task.indexOf(";")+1);
      zwyciesca[i]=task.substring(0, task.indexOf(";"));
      task=task.substring(task.indexOf(";")+1);
      
      for(int j=0;j<liczbaGraczy;j++) {
    	idGraczy[i][j]=task.substring(0, task.indexOf(","));
        task=task.substring(task.indexOf(",")+1);
        pieniadze[i][j]=Integer.parseInt(task.substring(0, task.indexOf(";")));
        task=task.substring(task.indexOf(";")+1);
      }
      try { task=task.substring(2); } catch(StringIndexOutOfBoundsException e) {}
    }
    
    table.tell(new RankingMsg(idGraczy, pieniadze, numerRundy, zwyciesca),client);
  }
  
  public void G_NEWROUND(String task) {
  }
  
  public void G_LICYTACJA(String task) {
    task=task.substring(12);
	table.tell(new LicytacjaMsg(task, "bedzie rozpoczynal."),client);
  }
  
  public void G_ALLIN(String task) {
    task=task.substring(8);
	table.tell(new SpecialMsg(task, "Zagralem All-in","ALLIN"),client);
  }
  
  public void G_PLAYERCASH(String task) {
    task=task.substring(13);
	//table.tell(new Result("Posiadasz: "+task,"PLAYERCASH"),client);
  }
  
  public void G_LOSE(String task) {
	table.tell(new Info("Przgralem",clientName),client);
  }

  
  /**
   * Metoda obslugujaca komunikaty bledow wyslane przez serwer.
   * @param LastTask Ostatni komunikat wyslany do serwera.
   */
  public void G_ERROR(String LastTask) {
    LastTask=LastTask.substring(LastTask.indexOf("_")+1);
    try{ LastTask=LastTask.substring(0, LastTask.indexOf("_")); } catch(StringIndexOutOfBoundsException e) {}
	    
    switch(LastTask) {
      case "START": table.tell(new Result("Nie udalo sie rozpoczac gry","Table"), client);
                    break;
      case "CALL":  table.tell(new Result("Nie mozna zagrac Call, zamala liczba pieniedzy","Table"), client);
                    break;
      case "RAISE": table.tell(new Result("Nie mozna zagrac Raise, zamala liczba pieniedzy","Table"), client);
                    break;
    }
  }
}
